home *** CD-ROM | disk | FTP | other *** search
/ Night Owl 6 / Night Owl's Shareware - PDSI-006 - Night Owl Corp (1990).iso / 003a / mmmmaze.zip / MMMMAZE.BAS next >
BASIC Source File  |  1991-07-17  |  23KB  |  636 lines

  1. CLS
  2. LOCATE 25,1
  3. PRINT "MAD MAD MAD MAZES!   Copyright 1989 Frederick Volking   Version: 1.0";
  4.  
  5. LOCATE 13,20 : PRINT "         <C> = Color Graphics Adapter (CGA)";
  6. LOCATE 14,20 : PRINT "         <E> = Enhanced Graphics Adapter (EGA)";
  7. LOCATE 15,20 : PRINT "         <V> = Video Graphics Adapter (VGA)";
  8. LOCATE 11,20 : PRINT "Which Graphics Adapter? : ";
  9. DO : GMode$ = INKEY$ : LOOP WHILE (GMODE$ = "")
  10. IF GMode$ = "" THEN END
  11. GMode$ = UCASE$(GMode$)
  12. IF INSTR("CEV",Gmode$) = 0 THEN END
  13. IF GMode$ = "C" THEN GMode% = 2
  14. IF GMode$ = "E" THEN GMode% = 8
  15. IF GMode$ = "V" THEN GMode% = 12
  16. '================================== Initialize Hardware & Random Seed Generator
  17. Screen GMode%
  18. ScoreFile$ = "MAZESCOR.DAT"
  19. DEFINT A-Z
  20. K% = VAL(MID$(DATE$,4,2))+VAL(RIGHT$(TIME$,2))+VAL(LEFT$(TIME$,2))+VAL(MID$(TIME$,4,2))
  21. Randomize K%
  22. '============================================ Define Static Substitution Macros
  23. %FALSE  = 0
  24. %TRUE   = 1
  25. %UP     = 1
  26. %LEFT   = 2
  27. %DOWN   = 3
  28. %RIGHT  = 4
  29.  
  30. %OUP    = 1
  31. %ORIGHT = 2
  32. %ODOWN  = 4
  33. %OLEFT  = 8
  34. %TUP    = 16
  35. %TRIGHT = 32
  36. %TDOWN  = 64
  37. %TLEFT  = 128
  38. '====================================================== Define Default settings
  39. IF GMode% = 2 THEN
  40.    Xaxis% = 191 : Yaxis% = 639
  41. END IF
  42. IF GMode% = 8 THEN
  43.    Xaxis% = 191 : Yaxis% = 639 : PcolorON% = 3
  44. END IF
  45. IF GMode% = 12 THEN
  46.    Xaxis% = 380 : Yaxis% = 639 : PcolorON% = 3
  47. END IF
  48. DIM STATIC HighTimes&(10),Whose(10)
  49. IF GMode% = 2 THEN
  50.    TokenColor% = 1
  51.    CrumbColor% = 1
  52.    WallColor% = 1
  53. ELSE
  54.    TokenColor% = 12
  55.    CrumbColor% = 11
  56.    WallColor%  = 7
  57.    GOSUB SetUpColors
  58. END IF
  59. Cmd$ = UCASE$(COMMAND$)
  60. CountDown% = %TRUE
  61. '===================================================== Main Program Loop Begins
  62. Cycle% = 1
  63. WHILE (Cycle% < 11)
  64.    CLS
  65.    SELECT CASE Cycle%
  66.       CASE =  1 : CellSize% = 30
  67.       CASE =  2 : CellSize% = 25
  68.       CASE =  3 : CellSize% = 20
  69.       CASE =  4 : CellSize% = 15
  70.       CASE =  5 : CellSize% = 12
  71.       CASE =  6 : CellSize% = 9
  72.       CASE =  7 : CellSize% = 7
  73.       CASE =  8 : CellSize% = 5
  74.       CASE =  9 : CellSize% = 3
  75.       CASE = 10 : CellSize% = 2
  76.    END SELECT
  77.    GOSUB PrintLine25
  78.    '=========================================== Calculate global default values
  79.    CellsTall%   = ( FIX(Xaxis% / CellSize%))
  80.    CellsWide%   = ( FIX((Yaxis% / CellSize%) / 2 ))
  81.    FrameBottom% = (CellsTall% * CellSize%)
  82.    FrameRight%  = (CellsWide% * (CellSize% * 2))
  83.    WallsToDraw% = ((CellsTall%+1) * (CellsWide%+1)) - ((CellsTall%+CellsWide%) * 2 )
  84.    '============================================== Dimension appropriate arrays
  85.    DIM DYNAMIC Walls%(CellsTall%,CellsWide%)
  86.    '=================================================== Initialize array values
  87.    FOR C% = 0 to CellsWide%
  88.       Walls%(0,C%) = 1
  89.       Walls%(CellsTall%,C%) = 1
  90.    NEXT
  91.    FOR C% = 0 to CellsTall%
  92.       Walls%(C%,0) = 1
  93.       Walls%(C%,CellsWide%) = 1
  94.    NEXT
  95.    '================================================================= Draw maze
  96.    GOSUB DrawMaze
  97.    ERASE Walls%
  98.    DIM DYNAMIC Pfield%(CellsTall%+1,CellsWide%+1)
  99.    '============================================================ One Maze Cycle
  100.    DoorOut% = (FnR%(CellsTall%-2))+1
  101.    LINE (0,DoorOut%*CellSize%) - (0,(DoorOut%*CellSize%)+(CellSize%)), 0
  102.    OriginX% = (FnR%(CellsTall%-2))+1
  103.    CurX% = OriginX%
  104.    CurY% = CellsWide%
  105.    LastCurX% = CurX%
  106.    LastCurY% = CurY%
  107.    IF Cmd$ = "DEMO"  THEN
  108.       KeepGoing% = %FALSE
  109.       AutoSolve% = %TRUE
  110.    ELSE
  111.       KeepGoing% = %TRUE
  112.       AutoSolve% = %FALSE
  113.    END IF
  114.    INCR DoorOut%
  115.    MazeIsDrawn% = %TRUE
  116.    BeginTimer! = TIMER
  117.    WHILE (KeepGoing%)
  118.       IF PField%(CurX%,CurY%) = 1 THEN
  119.          CALL DrawPiece(LastCurX%,LastCurY%,0,0)
  120.          PField%(LastCurX%,LastCurY%) = 0
  121.       ELSE
  122.          CALL DrawPiece(LastCurX%,LastCurY%,TokenColor%,1)
  123.       END IF
  124.       CALL DrawPiece(CurX%,CurY%,TokenColor%,0)
  125.       PField%(CurX%,CurY%) = 1
  126.       LastCurX% = CurX%
  127.       LastCurY% = CurY%
  128.       DO
  129.          K$ = INKEY$
  130.          GOSUB ShowElapsed
  131.       LOOP WHILE (K$ = "")
  132.       IF (LEN(K$) = 2) THEN K% = 1000 ELSE K% = 0
  133.       K% = K% + ASC(RIGHT$(K$,1))
  134.       Xnext% = CurX%
  135.       Ynext% = CurY%
  136.       SELECT CASE K%
  137.          CASE 1072 : DECR Xnext%           ' Up
  138.          CASE 1077 : INCR Ynext%           ' Right
  139.          CASE 1080 : INCR Xnext%           ' Down
  140.          CASE 1075 : DECR Ynext%           ' Left
  141.          CASE   27 : GOSUB ExitRequested   ' ESC
  142.       END SELECT
  143.       IF ((Xnext% = DoorOut%) AND (Ynext% = 0)) THEN
  144.          KeepGoing% = %FALSE
  145.       ELSE
  146.          IF FnBlocked%(CurX%,CurY%,XNext%,Ynext%) THEN
  147.             XNext% = CurX%
  148.             YNext% = CurY%
  149.          END IF
  150.       END IF
  151.       CurX% = Xnext%
  152.       CurY% = Ynext%
  153.    WEND
  154.    MazeIsDrawn% = %FALSE
  155.    IF AutoSolve% THEN
  156.       BeginTimer! = TIMER
  157.       GOSUB YouDoIt
  158.       GOSUB ShowTotalMazeTime
  159.       IF Cmd$ = "DEMO" THEN
  160.          W% = FnStartTimer%(10)
  161.          WHILE FnSecondsElapsed%(25,70) > 0
  162.             IF INKEY$ > "" THEN GOSUB ExitRequested
  163.          WEND
  164.       ELSE
  165.          LOCATE 25,1 : PRINT SPACE$(79);
  166.          LOCATE 25,21 : PRINT "Press <ANY KEY> to return to DOS";
  167.          WHILE INKEY$ = "" : WEND
  168.          CLS
  169.          END
  170.      END IF
  171.    ELSE
  172.       GOSUB ShowTotalMazeTime
  173.    END IF
  174.    ERASE Pfield%
  175.    INCR Cycle%
  176.    IF Cmd$ = "DEMO" THEN
  177.       IF Cycle% = 11 THEN Cycle% = 1
  178.    END IF
  179. WEND
  180. LOCATE 25,1 : PRINT SPACE$(79);
  181. LOCATE 25,21 : PRINT "Press <ANY KEY> to return to DOS";
  182. WHILE INKEY$ = "" : WEND
  183. END 'of main program loop
  184. '==============================================================================
  185. '===================== Functions & Subroutines Begin ==========================
  186. '==============================================================================
  187. '================================================ Define Random Number Function
  188. DEF FnR%(X%) = INT(RND * X%) + 1
  189. '=================================================== Automatically solve a maze
  190. YouDoIt:
  191.    '========================================= Erase old path & return to origin
  192.    KeepBacking% = %True
  193.    WHILE KeepBacking%
  194.       PField%(CurX%,CurY%) = 0
  195.       CALL DrawPiece(CurX%,CurY%,0,0)
  196.       IF ((CurX% = OriginX%) AND (CurY% = CellsWide%)) THEN
  197.          KeepBacking% = %FALSE
  198.       ELSE
  199.          Trim% = 0
  200.          IF FnBlocked%(CurX%,CurY%,CurX%-1,CurY%  ) = %FALSE THEN _
  201.             IF (PField%(CurX%-1,CurY%  ) = 1) THEN Trim% = %UP
  202.          IF FnBlocked%(CurX%,CurY%,CurX%  ,CurY%-1) = %FALSE THEN _
  203.             IF (PField%(CurX%  ,CurY%-1) = 1) THEN Trim% = %LEFT
  204.          IF FnBlocked%(CurX%,CurY%,CurX%+1,CurY%  ) = %FALSE THEN _
  205.             IF (PField%(CurX%+1,CurY%  ) = 1) THEN Trim% = %DOWN
  206.          IF FnBlocked%(CurX%,CurY%,CurX%  ,CurY%+1) = %FALSE THEN _
  207.             IF (PField%(CurX%  ,CurY%+1) = 1) THEN Trim% = %RIGHT
  208.          SELECT CASE Trim%
  209.             CASE %UP    : DECR CurX%
  210.             CASE %LEFT  : DECR CurY%
  211.             CASE %DOWN  : INCR CurX%
  212.             CASE %RIGHT : INCR CurY%
  213.          END SELECT
  214.       END IF
  215.    WEND
  216.    '================================================================ Solve Maze
  217.    AllTested% = %TUP + %TRIGHT + %TDOWN + %TLEFT
  218.    PField%(CurX%,CurY%) = %ORIGHT + %TRIGHT
  219.    NotFoundYet% = %TRUE
  220.    MazeIsDrawn% = %FALSE
  221.    IF Cmd$ = "DEMO" THEN
  222.       CALL DrawPiece(CurX%,CurY%,TokenColor%,0)
  223.       W% = FnStartTimer%(10)
  224.       WHILE FnSecondsElapsed%(25,70) > 0
  225.          IF INKEY$ > "" THEN GOSUB ExitRequested
  226.       WEND
  227.    END IF
  228.    DO
  229.       IF INKEY$ > "" THEN GOSUB ExitRequested
  230.       GOSUB ShowElapsed
  231.       IF ((PField%(LastCurX%,LastCurY%) AND AllTested) = AllTested) THEN _
  232.          CALL DrawPiece(LastCurX%,LastCurY%,0,0) _
  233.       ELSE CALL DrawPiece(LastCurX%,LastCurY%,TokenColor%,1)
  234.       CALL DrawPiece(CurX%,CurY%,TokenColor%,0)
  235.       LastCurX% = CurX%
  236.       LastCurY% = CurY%
  237.  
  238.       IF ((PField%(CurX%,CurY%) AND %TUP) <> %TUP) THEN
  239.          IF FnBlocked%(CurX%,CurY%,CurX%-1,CurY%) = %TRUE THEN
  240.             PField%(CurX%,CurY%) = PField%(CurX%,CurY%) + %TUP
  241.          ELSE
  242.             IF ((PField%(CurX%-1,CurY%) AND AllTested%) = AllTested%) THEN _
  243.                PField%(CurX%,CurY%) = PField%(CurX%,CurY%) + %TUP
  244.          END IF
  245.       END IF
  246.  
  247.       IF ((PField%(CurX%,CurY%) AND %TDOWN) <> %TDOWN) THEN
  248.          IF FnBlocked%(CurX%,CurY%,CurX%+1,CurY%) = %TRUE THEN
  249.             PField%(CurX%,CurY%) = PField%(CurX%,CurY%) + %TDOWN
  250.          ELSE
  251.             IF ((PField%(CurX%+1,CurY%) AND AllTested%) = AllTested%) THEN _
  252.                PField%(CurX%,CurY%) = PField%(CurX%,CurY%) + %TDOWN
  253.          END IF
  254.       END IF
  255.  
  256.       IF ((PField%(CurX%,CurY%) AND %TLEFT) <> %TLEFT) THEN
  257.          IF FnBlocked%(CurX%,CurY%,CurX%,CurY%-1) = %TRUE THEN
  258.             PField%(CurX%,CurY%) = PField%(CurX%,CurY%) + %TLEFT
  259.          ELSE
  260.             IF ((PField%(CurX%,CurY%-1) AND AllTested%) = AllTested%) THEN _
  261.                PField%(CurX%,CurY%) = PField%(CurX%,CurY%) + %TLEFT
  262.          END IF
  263.       END IF
  264.  
  265.       IF ((PField%(CurX%,CurY%) AND %TRIGHT) <> %TRIGHT) THEN
  266.          IF FnBlocked%(CurX%,CurY%,CurX%,CurY%+1) = %TRUE THEN
  267.             PField%(CurX%,CurY%) = PField%(CurX%,CurY%) + %TRIGHT
  268.          ELSE
  269.             IF ((PField%(CurX%,CurY%+1) AND AllTested%) = AllTested%) THEN _
  270.                PField%(CurX%,CurY%) = PField%(CurX%,CurY%) + %TRIGHT
  271.          END IF
  272.       END IF
  273.  
  274.       IF ((PField%(CurX%,CurY%) AND AllTested) = AllTested) THEN
  275.          IF ((PField%(CurX%,CurY%) AND %ORIGHT) = %ORIGHT) THEN
  276.             INCR CurY%
  277.             PField%(CurX%,CurY%) = PField%(CurX%,CurY%) + %TLEFT
  278.          ELSE
  279.             IF ((PField%(CurX%,CurY%) AND %OLEFT) = %OLEFT) THEN
  280.                DECR CurY%
  281.                PField%(CurX%,CurY%) = PField%(CurX%,CurY%) + %TRIGHT
  282.             ELSE
  283.                IF ((PField%(CurX%,CurY%) AND %OUP) = %OUP) THEN
  284.                   DECR CurX%
  285.                   PField%(CurX%,CurY%) = PField%(CurX%,CurY%) + %TDOWN
  286.                ELSE
  287.                   INCR CurX%
  288.                   PField%(CurX%,CurY%) = PField%(CurX%,CurY%) + %TUP
  289.                END IF
  290.             END IF
  291.          END IF
  292.       ELSE
  293.          IF ((PField%(CurX%,CurY%) AND %TRIGHT) <> %TRIGHT) THEN
  294.             INCR CurY%
  295.             PField%(CurX%,CurY%) = PField%(CurX%,CurY%) + %TLEFT + %OLEFT
  296.          ELSE
  297.             IF ((PField%(CurX%,CurY%) AND %TLEFT) <> %TLEFT) THEN
  298.                DECR CurY%
  299.                PField%(CurX%,CurY%) = PField%(CurX%,CurY%) + %TRIGHT + %ORIGHT
  300.             ELSE
  301.                IF ((PField%(CurX%,CurY%) AND %TUP) <> %TUP) THEN
  302.                   DECR CurX%
  303.                   PField%(CurX%,CurY%) = PField%(CurX%,CurY%) + %TDOWN + %ODOWN
  304.                ELSE
  305.                   INCR CurX%
  306.                   PField%(CurX%,CurY%) = PField%(CurX%,CurY%) + %TUP + %OUP
  307.                END IF
  308.             END IF
  309.          END IF
  310.       END IF
  311.       IF ((CurX% = DoorOut%) AND (CurY% = 1)) THEN NotFoundYet% = %FALSE
  312.    LOOP WHILE (NotFoundYet% = %TRUE)
  313.    CALL DrawPiece(LastCurX%,LastCurY%,TokenColor%,1)
  314.    CALL DrawPiece(CurX%,CurY%,TokenColor%,0)
  315.    IF Cmd$ <> "DEMO" THEN SOUND 500,10
  316. RETURN
  317. '=========================================== Determine if XY to XY move is Okay
  318. DEF FnBlocked%(OldX%,OldY%,NewX%,NewY%)
  319.    SHARED CellSize%,CellsTall%,CellsWide%
  320.    LOCAL TestDirect%,XPoint%,YPoint%
  321.    IF ((NewX%<1) OR (NewX%>CellsTall%) OR _
  322.        (NewY%<1) OR (NewY%>CellsWide%)) THEN
  323.       FnBlocked% = %TRUE
  324.    ELSE
  325.       IF OldX% = NewX% THEN
  326.          IF OldY% > NewY% THEN TestDirect% = %LEFT ELSE TestDirect% = %RIGHT
  327.       ELSE
  328.          IF OldX% > NewX% THEN TestDirect% = %Up ELSE TestDirect% = %DOWN
  329.       END IF
  330.       Xpoint% = ((CurX% - 1) *  CellSize%) + 1
  331.       Ypoint% = ((CurY% - 1) * (CellSize% * 2)) + 1
  332.       SELECT CASE TestDirect%
  333.          CASE %UP    : DECR Xpoint%                      ' Up
  334.          CASE %RIGHT : Ypoint%=Ypoint%+((CellSize%*2)-1) ' Right
  335.          CASE %DOWN  : Xpoint%=Xpoint%+(CellSize%-1)     ' Down
  336.          CASE %LEFT  : DECR Ypoint%                      ' Left
  337.       END SELECT
  338.       IF POINT(Ypoint%,Xpoint%) THEN FnBlocked% = %TRUE ELSE FnBlocked% = %FALSE
  339.    END IF
  340. END DEF
  341. '==================================================================== Draw Maze
  342. DrawMaze:
  343.    LINE (0,0) - (FrameRight%, FrameBottom%), WallColor%, B
  344.    HalfWallsToDraw% = int(WallsToDraw% / 2)
  345.    WHILE (WallsToDraw% > HalfWallsToDraw%)
  346.       IF INKEY$>"" THEN GOSUB ExitRequested
  347.       DO
  348.          MostX% = FnR%(CellsTall%)
  349.          MostY% = FnR%(CellsWide%)
  350.       LOOP WHILE (Walls%(MostX%,MostY%) = 1)
  351.       GOSUB DrawWall
  352.    WEND
  353.    CyclicMostX% = 1
  354.    CyclicMostY% = 1
  355.    WHILE (WallsToDraw% > 0)
  356.       IF INKEY$>"" THEN GOSUB ExitRequested
  357.       DO
  358.          INCR CyclicMostY%
  359.          IF CyclicMostY% = CellsWide% THEN
  360.             CyclicMostY% = 1
  361.             INCR CyclicMostX%
  362.             IF CyclicMostX% = CellsTall% THEN CyclicMostX% = 1
  363.          END IF
  364.       LOOP WHILE (Walls%(CyclicMostX%,CyclicMostY%) = 1)
  365.       MostX% = CyclicMostX%
  366.       MostY% = CyclicMostY%
  367.       GOSUB DrawWall
  368.    WEND
  369. RETURN
  370. '=========================================================== Draw players piece
  371. SUB DrawPiece(AtX%, AtY%, UseColor%, DroppingMark%)
  372.    LOCAL  TopXcoord%,TopYcoord%,BotXcoord%,BotYCoord%,CenterY%,CenterX%,Rads%
  373.    SHARED CellSize%, PColorON%, CrumbColor%
  374.    TopXcoord% = ((AtX% - 1) *  CellSize%) + 1
  375.    TopYcoord% = ((AtY% - 1) * (CellSize% * 2)) + 1
  376.    BotXcoord% = (TopXcoord% + CellSize%) - 2
  377.    BotYcoord% = (TopYcoord% + (CellSize% * 2)) - 2
  378.    IF DroppingMark% THEN
  379.       LINE (TopYcoord%, TopXcoord%) - (BotYcoord%, BotXcoord%), 0, BF
  380.       CenterY% = TopYcoord%+CellSize%
  381.       CenterX% = TopXcoord%+FIX(CellSize%/2)
  382.       Rads% = INT(CellSize% / 3)
  383.       IF CellSize% = 2 THEN
  384.          PSET (TopYcoord%+1, TopXCoord%), CrumbColor%
  385.       ELSE
  386.          IF Rads% < 3 THEN
  387.             PSET (CenterY%, CenterX%), CrumbColor%
  388.          ELSE
  389.             CIRCLE (CenterY%, CenterX%), Rads%, CrumbColor%
  390.          END IF
  391.       END IF
  392.    ELSE
  393.       LINE (TopYcoord%, TopXcoord%) - (BotYcoord%, BotXcoord%), UseColor%, BF
  394.    END IF
  395. END SUB
  396. '================================================== Print Title & Current Level
  397. PrintLine25:
  398.    LOCATE 25,1
  399.    PRINT SPACE$(79);
  400.    LOCATE 25,1
  401.    PRINT "MAD MAZES!  Copyright 1989 Frederick Volking  V:1.0  Level: ";
  402.    PRINT USING "## of 10";Cycle%;
  403. RETURN
  404. '==================================================================== Draw Wall
  405. DrawWall:
  406.       FOR Which% = 1 TO 0 STEP (-1)
  407.          Direc% = FnR%(4)
  408.          InitMostX% = MostX%
  409.          InitMostY% = MostY%
  410.          WHILE (Walls%(MostX%,MostY%) = Which%)
  411.             SELECT CASE Direc%
  412.                CASE = 1 : DECR MostX%  'Up
  413.                CASE = 2 : INCR MostY%  'Right
  414.                CASE = 3 : INCR MostX%  'Down
  415.                CASE = 4 : DECR MostY%  'Left
  416.             END SELECT
  417.             IF ((MostX% < 0) OR (MostX% > CellsTall%) OR _
  418.                 (MostY% < 0) OR (MostY% > CellsWide%)) THEN
  419.                 IF Direc% = 4 THEN Direc% = 1 _
  420.                    ELSE INCR Direc%
  421.                 MostX% = InitMostX%
  422.                 MostY% = InitMostY%
  423.              END IF
  424.          WEND
  425.       NEXT
  426.       SELECT CASE Direc%
  427.          CASE = 1 : LastDirec% = 3  'Up
  428.          CASE = 2 : LastDirec% = 4  'Right
  429.          CASE = 3 : LastDirec% = 1  'Down
  430.          CASE = 4 : LastDirec% = 2  'Left
  431.       END SELECT
  432.       LastX% = MostX% * CellSize%
  433.       LastY% = (MostY% * 2) * CellSize%
  434.       DeadEndReached% = %FALSE
  435.       DO
  436.          Cycles% = 0
  437.          KeepLooking% = %TRUE
  438.          DO
  439.             INCR Cycles%
  440.             NewX% = LastX%
  441.             NewY% = LastY%
  442.             Direc% = LastDirec%
  443.             Turn% = (FnR%(3)-2)
  444.             IF Turn%<>0 THEN
  445.                Direc% = Direc% + Turn%
  446.                IF Direc% > 4 THEN Direc% = 1
  447.                IF Direc% < 1 THEN Direc% = 4
  448.             END IF
  449.             SELECT CASE Direc%
  450.                CASE = 1 : NewX% = LastX% -  CellSize%       'up
  451.                CASE = 2 : NewY% = LastY% + (CellSize% * 2)  'right
  452.                CASE = 3 : NewX% = LastX% +  CellSize%       'down
  453.                CASE = 4 : NewY% = LastY% - (CellSize% * 2)  'left
  454.             END SELECT
  455.             IF Cycles% < 10 THEN
  456.                IF ((NewX% => FrameBottom%) OR (NewX% <= 0) OR _
  457.                    (NewY% => FrameRight% ) OR (NewY% <= 0) ) THEN
  458.                   KeepLooking% = %TRUE
  459.                ELSE
  460.                   XC% = FIX(NewX% / CellSize%)
  461.                   YC% = FIX(NewY% / (CellSize% * 2))
  462.                   IF Walls%(XC%,YC%) = 0 THEN KeepLooking% = %FALSE _
  463.                      ELSE KeepLooking% = %TRUE
  464.                END IF
  465.             ELSE
  466.                KeepLooking% = %FALSE
  467.             END IF
  468.          LOOP WHILE (KeepLooking% = %TRUE)
  469.          IF Cycles% < 10 THEN
  470.             LINE (LastY%,LastX%) - (NewY%,NewX%), WallColor%
  471.             Walls%(XC%,YC%) = 1
  472.             DECR WallsToDraw%
  473.             LastX% = NewX%
  474.             LastY% = NewY%
  475.             LastDirec% = Direc%
  476.             DeadEndReached% = %FALSE
  477.          ELSE
  478.             DeadEndReached% = %TRUE
  479.          END IF
  480.       LOOP WHILE (DeadEndReached% = %FALSE)
  481. RETURN
  482. '============================================================== Exit Requested?
  483. ExitRequested:
  484.    LOCATE 25,1 : PRINT SPACE$(79);
  485.    LOCATE 25,34
  486.    PRINT "Quit? (Y/N) : ";
  487.    DO
  488.       K$ = UCASE$(INKEY$)
  489.    LOOP WHILE ((K$ <> "Y") AND (K$ <> "N") AND (K$ <> CHR$(27)))
  490.    IF K$ = "Y" THEN
  491.       IF MazeIsDrawn% = %TRUE THEN
  492.          LOCATE 25,1 : PRINT SPACE$(79);
  493.          LOCATE 25,25
  494.          PRINT "Shall I Solve It? (Y/N) : ";
  495.          DO
  496.             K$ = UCASE$(INKEY$)
  497.          LOOP WHILE ((K$ <> "Y") AND (K$ <> "N") AND (K$ <> CHR$(27)))
  498.          IF K$ = "N" THEN
  499.             SCREEN 0,0
  500.             CLS
  501.             END
  502.          END IF
  503.          IF K$ = "Y" THEN
  504.             AutoSolve% = %TRUE
  505.             KeepGoing% = %FALSE
  506.          END IF
  507.       ELSE
  508.          SCREEN 0,0
  509.          CLS
  510.          END
  511.       END IF
  512.    END IF
  513.    GOSUB PrintLine25
  514. RETURN
  515. '============================= Display Total elapsed playing time for this maze
  516. ShowElapsed:
  517.    TimerNow! = TIMER
  518.    TotTime! = TimerNow! - BeginTimer!
  519.    Minutes% = FIX(TotTime! / 60)
  520.    Seconds% = INT(TotTime! - (Minutes% * 60))
  521.    IF Seconds% <> LastSeconds% THEN
  522.       LOCATE 25, 73, 0
  523.       PRINT USING "###";Minutes%;
  524.       PRINT ":";
  525.       PRINT RIGHT$(STR$(Seconds%+100),2);
  526.       LastSeconds% = Seconds%
  527.    END IF
  528. RETURN
  529. '======================================= Display Time required to complete maze
  530. ShowTotalMazeTime:
  531.       TimerNow! = TIMER
  532.       TotTime!  = TimerNow! - BeginTimer!
  533.       Minutes%  = FIX(TotTime! / 60)
  534.       LSeconds! = TotTime! - (Minutes% * 60)
  535.       LOCATE 25,1 : PRINT SPACE$(79);
  536.       LOCATE 25,1
  537.       IF AutoSolve% = %TRUE THEN PRINT "COMPUTER's "; _
  538.          ELSE PRINT "Your ";
  539.       PRINT "time to complete level";Cycle%;"was: ";
  540.       IF Minutes% > 0 THEN PRINT Minutes%; "Minute(s) ";
  541.       PRINT USING "##.# Seconds  - Press <ANY KEY>";LSeconds!;
  542.       IF Cmd$ <> "DEMO" THEN
  543.          WHILE INKEY$ = "" : WEND
  544.       END IF
  545. RETURN
  546. '====================================================== ReDefine and Set Colors
  547. SetUpColors:
  548.    CLS
  549.    DIM DYNAMIC TempColor%(3)
  550.    TempColor%(1) = WallColor%
  551.    TempColor%(2) = TokenColor%
  552.    TempColor%(3) = CrumbColor%
  553.    FOR C% = 1 to 15
  554.       LINE (29+(c%*32),30) - (29+(C%*32)+20,70), C%, BF
  555.       LOCATE 10, (c%*4)+5
  556.       PRINT USING "##";C%;
  557.    NEXT
  558.    LOCATE 14,20 : PRINT "Color for Maze Walls     : ";
  559.    LOCATE 16,20 : PRINT "Color for Player's Token : ";
  560.    LOCATE 18,20 : PRINT "Color for Bread Crumbs   : ";
  561.    LOCATE 21,20 : PRINT "Press - <Up> & <Down> to Select";
  562.    LOCATE 22,20 : PRINT "      - <Left> & <Right> to change color";
  563.    LOCATE 2,20 : PRINT "       <ENTER> when finished";
  564.    CurLine% = 1
  565.    DO
  566.       IF CurLine% < 1 THEN CurLine% = 3
  567.       IF CurLine% > 3 THEN CurLine% = 1
  568.       FOR C% = 1 to 3
  569.          IF TempColor%(C%) <  1 THEN TempColor%(C%)= 15
  570.          IF TempColor%(C%) > 15 THEN TempColor%(C%) = 1
  571.          LOCATE ((C% - 1) * 2) + 14, 47
  572.          PRINT USING "##     ";TempColor%(C%);
  573.       NEXT
  574.       LOCATE ((CurLine% - 1) * 2) + 14, 50
  575.       PRINT "<--";
  576.       DO
  577.          KeyChoice$ = INKEY$
  578.       LOOP WHILE KeyChoice$ = ""
  579.       Choice% = ASC(RIGHT$(KeyChoice$,1))
  580.       SELECT CASE Choice%
  581.          CASE 72 : DECR CurLine%             ' Up
  582.          CASE 80 : INCR CurLine%             ' Down
  583.          CASE 77 : INCR TempColor%(CurLine%) ' Right
  584.          CASE 75 : DECR TempColor%(CurLine%) ' Left
  585.          CASE 27 : GOSUB ExitRequested
  586.       END SELECT
  587.    LOOP WHILE (KeyChoice$ <> CHR$(13))
  588.    CLS
  589.    WallColor% = TempColor%(1)
  590.    TokenColor% = TempColor%(2)
  591.    CrumbColor% = TempColor%(3)
  592.    ERASE TempColor%
  593. RETURN
  594. '=============================================================================
  595. DEF FnStartTimer%(Long%)
  596.    SHARED Elapsed&,CountDown%
  597.    IF Long% = 0 THEN
  598.       CountDown% = %FALSE
  599.       Elapsed& = 0
  600.    ELSE
  601.       CountDown% = %TRUE
  602.       Elapsed& = (CLNG(Long%)) * 997564
  603.    END IF
  604.    MTIMER
  605. END DEF
  606. '=============================================================================
  607. DEF FnSecondsElapsed%(TUR%,TUC%)
  608.    SHARED Elapsed&,CountDown%
  609.    LOCAL TimeSinceLast&, K%
  610.    TimeSinceLast&=MTIMER
  611.    MTIMER
  612.    Elapsed& = Elapsed& - TimeSinceLast&
  613.    IF Elapsed& < 0 THEN Elapsed& = 0
  614.    K% = FnShowTime(Elapsed&)
  615.    FnSecondsElapsed% = K%
  616. END DEF
  617. '=============================================================================
  618. DEF FnShowTime%(HowMuch&)
  619.    SHARED LastSecond%,CountDown%
  620.    LOCAL Minutes%, HoldSeconds%
  621.    HoldSeconds%=INT(FIX(HowMuch&/997564))
  622.    Minutes%=INT(FIX(HowMuch&/59853831))
  623.    HowMuch&=HowMuch&-(CLNG(Minutes%) * 59853831)
  624.    Seconds%=INT(FIX(HowMuch&/997564))
  625.    IF LastSecond%<>HoldSeconds% THEN
  626.       LOCATE 25,73
  627.       PRINT USING "###";Minutes%;
  628.       PRINT ":";
  629.       PRINT RIGHT$(STR$(Seconds%+100),2);
  630.       LastSecond%=HoldSeconds%
  631.    END IF
  632.    FnShowTime%=HoldSeconds%
  633. END DEF
  634. '=========================================================== End Of Programming
  635.  
  636.